home *** CD-ROM | disk | FTP | other *** search
- /**
- * Scout - The Amiga System Monitor
- *
- *------------------------------------------------------------------
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * You must not use this source code to gain profit of any kind!
- *
- *------------------------------------------------------------------
- *
- * @author Andreas Gelhausen
- * @author Richard Körber <rkoerber@gmx.de>
- */
-
-
-
- #include "scout_libs.h"
-
- extern struct ExecBase *SysBase;
- extern struct Library *IdentifyBase;
- extern struct Library *GfxBase;
- extern struct IntuitionBase *IntuitionBase;
-
- int libcnt,devcnt,rescnt;
-
- struct Remember *LibRememberKey,*DevRememberKey,*ResRememberKey;
-
- __asm LONG liblist_dspfunc(register __a2 char **array, register __a1 struct LibEntry *libentry, register __a0 struct Hook *hook) {
- if (libentry) {
- *array++ = libentry->lib_address;
- *array++ = libentry->lib_name;
- *array++ = libentry->lib_pri;
- *array++ = libentry->lib_ocnt;
- *array++ = libentry->lib_rcnt;
- *array++ = libentry->lib_type;
- *array = NULL;
- } else {
- *array++ = ESC "bAddress";
- *array++ = ESC "bln_Name";
- *array++ = ESC "bln_Pri";
- *array++ = ESC "bOpenC";
- *array++ = ESC "bRPC";
- *array++ = ESC "bln_Type";
- *array = NULL;
- }
- return(0);
- }
-
- struct Hook liblist_dsphook = {
- {NULL, NULL},
- (ULONG (* )())liblist_dspfunc,
- NULL, NULL
- };
-
- int TestResource (struct Library *lib) {
- char *name;
-
- name = lib->lib_Node.ln_Name;
-
- if ((stricmp (name, FILESYSTEM_RESNAME)) && (stricmp (name, CARD_RESNAME)) && \
- (stricmp (name, KEYMAP_RESNAME))) {
- return (TRUE);
- } else {
- return (FALSE);
- }
- }
-
- static struct FctEntry {
- struct FctEntry *fe_next;
- char fe_address[16];
- char fe_offsetdec[8];
- char fe_offsethex[8];
- //*UHEX* char fe_offsetuns[8];
- char fe_name[52];
- };
-
- __asm LONG lfctlist_dspfunc(register __a2 char **array, register __a1 struct FctEntry *entry, register __a0 struct Hook *hook) {
- if (entry) {
- *array++ = entry->fe_offsetdec;
- *array++ = entry->fe_offsethex;
- //*UHEX* *array++ = entry->fe_offsetuns;
- *array++ = entry->fe_address;
- *array = entry->fe_name;
- } else {
- *array++ = ESC "bOffset";
- *array++ = ESC "bHex";
- //*UHEX* *array++ = ESC "bU-Hex";
- *array++ = ESC "bAddress";
- *array = ESC "bName";
- }
- return(0);
- }
-
- struct Hook lfctlist_dsphook = {
- {NULL, NULL},
- (ULONG (* )())lfctlist_dspfunc,
- NULL, NULL
- };
-
- void GetLDRFctList (struct Library *lib, char mode) {
- struct WinFree *ptr;
- unsigned char *title = "FUNCTIONS: ";
- APTR lfctlist;
- ULONG offset, max;
- struct FctEntry *entry;
- APTR fctadr;
- BOOL getfct = (IdentifyBase!=NULL);
- STRPTR name;
-
- if (ptr = AllocWinFree()) {
- ptr->wf_Window = (APTR) WindowObject,
- MUIA_HelpNode, "Functions",
- MUIA_Window_ID, MakeDetailID('.','L','F','T'),
- WindowContents, VGroup,
- Child, lfctlist = ListviewObject,
- MUIA_Listview_Input, FALSE,
- MUIA_Listview_List, ListObject,
- ReadListFrame,
- MUIA_List_Title, TRUE,
- MUIA_List_Format, "DELTA=8 P=\33r, DELTA=8 P=\33r, DELTA=8,",
- //*UHEX* MUIA_List_Format, "DELTA=8 P=\33r, P=\33r, DELTA=8 P=\33r, DELTA=8,",
- MUIA_List_DisplayHook, &lfctlist_dsphook,
- End,
- End,
- End, End;
-
- if (ptr->wf_Window) {
-
- name = lib->lib_Node.ln_Name;
-
- if( mode!='R' || (
- stricmp(name, FILESYSTEM_RESNAME)
- && stricmp(name, CARD_RESNAME)
- && stricmp(name, KEYMAP_RESNAME))) {
-
- if(!stricmp(name,"ciaa.resource") || !stricmp(name,"ciab.resource"))
- name = "cia.resource";
-
- max = lib->lib_NegSize;
-
- set(lfctlist,MUIA_List_Quiet,TRUE);
-
- for(offset=6; offset <= max; offset+=6) {
- if(entry = AllocRemember (&ptr->wf_RememberKey, sizeof (struct FctEntry), MEMF_ANY|MEMF_CLEAR)) {
-
- if(*(WORD *)(((UBYTE*)lib) - offset) == 0x4ef9) {
- fctadr = (APTR) *(LONG *)(((UBYTE *)lib) - offset + 2);
- if (points2ram(fctadr)) {
- sprintf (entry->fe_address, HELL "$%08x" DUNKEL, fctadr);
- } else {
- sprintf (entry->fe_address, "$%08x", fctadr);
- }
- } else {
- strcpy(entry->fe_address, "<no jmp>");
- }
-
- sprintf (entry->fe_offsetdec, "-%3d" , offset);
- sprintf (entry->fe_offsethex, "-%04x" , offset);
- //*UHEX* sprintf (entry->fe_offsetuns, "%04X" , 0x10000-offset);
-
- if(offset<42 && (mode=='D' || (mode=='L' && offset<30))) {
-
- STRPTR help;
- switch(offset) {
- case 6: help = "Open" ; break;
- case 12: help = "Close" ; break;
- case 18: help = "Expunge"; break;
- case 24: help = "Null" ; break;
- case 30: help = "AbortIO"; break;
- case 36: help = "BeginIO"; break;
- }
- strcpy(entry->fe_name,help);
-
- } else if(getfct) {
- switch(IdFunctionTags(name,offset,IDTAG_FuncNameStr,entry->fe_name,TAG_DONE)) {
- case IDERR_NOFD:
- case IDERR_NOMEM:
- getfct = FALSE;
- break;
-
- case IDERR_OFFSET:
- strcpy(entry->fe_name,"---");
- break;
- }
- }
-
- InsertBottomEntry (lfctlist, (APTR *) &entry);
-
- }
- }
- set(lfctlist,MUIA_List_Quiet,FALSE);
- }
-
- HandleWindowOpen (ptr, title, lib->lib_Node.ln_Name);
- HandleWindowClose (ptr);
- }
- }
- }
-
-
- void GetLDRMore (struct Library *lib, char *title, char *helpnode) {
- unsigned char rpct[4];
- struct WinFree *ptr;
- int teststatus, rpc, i;
-
- APTR libmoretext0,libmoretext1,libmoretext2a,libmoretext2b,libmoretext3,libmoretext4;
- APTR LibMoreAdd1,LibMoreGroup1,LibMoreAdd2,LibMoreGroup2;
-
- UBYTE drflags[] = {DRF_ALLOC0,DRF_ALLOC1,DRF_ALLOC2,DRF_ALLOC3,
- DRF_ACTIVE,NULL};
-
- char *drflagstext[] = {"ALLOC0","ALLOC1","ALLOC2",
- "ALLOC3","ACTIVE"};
-
- teststatus = TestResource (lib);
-
- if (ptr = AllocWinFree()) {
- if (! stricmp (lib->lib_Node.ln_Name, FILESYSTEM_RESNAME)) {
-
- ptr->wf_Window = (APTR) WindowObject,
-
- MUIA_HelpNode, helpnode,
- MUIA_Window_ID, MakeDetailID('.','L','I','B'),
- WindowContents, HGroup,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- Child, MyLabel2 ("Name:"),
- Child, MyLabel2 ("Address:\nPri:"),
- Child, MyLabel2 ("fsr_Creator:"),
- End,
- Child, VGroup,
- Child, MyTextObject3 (FILESYSTEM_RESNAME),
- Child, HGroup,
- Child, libmoretext1 = MyTextObject(),
- Child, MyLabel ("Type:"),
- Child, libmoretext2b = MyTextObject(),
- End,
- Child, libmoretext3 = MyTextObject(),
- End,
- End, End;
-
- if (ptr->wf_Window) {
- MySetContents (libmoretext1, ESC "c$%08x\n%d", lib, lib->lib_Node.ln_Pri);
- MySetContents (libmoretext2b, ESC "c %s ", GetNodeType (lib->lib_Node.ln_Type));
-
- strcpy (tmpstr, ((struct FileSysResource *) lib)->fsr_Creator);
- healstring (tmpstr);
- set (libmoretext3, MUIA_Text_Contents, tmpstr);
-
- HandleWindowOpen (ptr, title, FILESYSTEM_RESNAME);
- HandleWindowClose (ptr);
- }
- } else if ((! stricmp (lib->lib_Node.ln_Name, CARD_RESNAME)) || \
- (! stricmp (lib->lib_Node.ln_Name, KEYMAP_RESNAME))) {
- ptr->wf_Window = (APTR) WindowObject,
-
- MUIA_HelpNode, helpnode,
- MUIA_Window_ID, MakeDetailID('.','L','I','B'),
- WindowContents, HGroup,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- Child, MyLabel2 ("Name:"),
- Child, MyLabel2 ("Address:\nPri:"),
- End,
- Child, VGroup,
- Child, MyTextObject3 (KEYMAP_RESNAME),
- Child, HGroup,
- Child, libmoretext1 = MyTextObject(),
- Child, MyLabel ("Type:"),
- Child, libmoretext2b = MyTextObject(),
- End,
- End,
- End, End;
-
- if (ptr->wf_Window) {
- MySetContents (libmoretext1, ESC "c$%08x\n%d", lib, lib->lib_Node.ln_Pri);
- MySetContents (libmoretext2b, ESC "c %s ", GetNodeType (lib->lib_Node.ln_Type));
-
- HandleWindowOpen (ptr, title, KEYMAP_RESNAME);
- HandleWindowClose (ptr);
- }
- } else {
- ptr->wf_Window = (APTR) WindowObject,
-
- MUIA_HelpNode, helpnode,
- MUIA_Window_ID, MakeDetailID('.','L','I','B'),
- WindowContents, HGroup,
- Child, LibMoreGroup1 = VGroup, MUIA_Group_SameWidth, TRUE,
- Child, MyLabel2 ("Name:"),
- Child, MyVSpace(0),
- Child, MyLabel2 ("Address:\nPri:\nType:\nVersion:\nOpenCnt:"),
- Child, MyVSpace(0),
- Child, MyLabel2 ("IdString:"),
- End,
- Child, LibMoreGroup2 = VGroup,
- Child, libmoretext0 = MyTextObject(),
- Child, HGroup,
- Child, libmoretext1 = MyTextObject(),
- Child, VGroup,
- Child, MyLabel ("Flags:"),
- Child, MyLabel ("NegSize:\nPosSize:\nSum:\nRamPtrCnt:"),
- End,
- Child, VGroup,
- Child, libmoretext2a = KeyButtonF ('b', lib->lib_Flags),
- Child, libmoretext2b = MyTextObject(),
- End,
- End,
- Child, libmoretext3 = MyTextObject(),
- End,
- End, End;
-
- if (ptr->wf_Window) {
- if ((rpc = GetRamPointerCount (lib)) == (lib->lib_NegSize / 6)) {
- strcpy (rpct, "***");
- } else {
- sprintf (rpct, "%d", rpc);
- }
- MySetContents (libmoretext1, ESC "c$%08x\n%d\n%s\n%d.%d\n%d", lib, lib->lib_Node.ln_Pri, GetNodeType (lib->lib_Node.ln_Type), lib->lib_Version, lib->lib_Revision, lib->lib_OpenCnt);
- MySetContents (libmoretext2b, ESC "c%d\n%d\n$%08x\n%s", lib->lib_NegSize, lib->lib_PosSize, lib->lib_Sum, rpct);
-
- if (! stricmp (lib->lib_Node.ln_Name, DISK_RESNAME)) {
- Child, LibMoreAdd1 = VGroup, MUIA_Group_SameWidth, TRUE,
- Child, MyLabel2 ("dr_Current:"),
- Child, MyLabel2 ("dr_CurrTask:"),
- End;
-
- Child, LibMoreAdd2 = VGroup,
- Child, libmoretext4 = MyTextObject(),
- Child, MyTextObject3 (GetTaskName (((struct DiscResource *) lib)->dr_CurrTask)),
- End;
-
- tmpstr[0] = '\0';
- i = 0;
- while (drflags[i]) {
- if (((struct DiscResource *) lib)->dr_Flags & drflags[i]) {
- if (strlen (tmpstr))
- strcat (tmpstr, ", ");
- strcat (tmpstr, drflagstext[i]);
- }
- i++;
- }
- set (libmoretext4, MUIA_Text_Contents, nonetest (tmpstr));
- DoMethod (LibMoreGroup1,OM_ADDMEMBER,LibMoreAdd1);
- DoMethod (LibMoreGroup2,OM_ADDMEMBER,LibMoreAdd2);
- }
-
- HandleFlagsButtonPressed (libmoretext2a, ptr, "(LIBRARY)", "lib_Flags", lib->lib_Flags, (struct LongFlag *) &lib_flags, NULL, 'b');
- HandleWindowOpen (ptr, title, lib->lib_Node.ln_Name);
- MySetContentsHealed (libmoretext0, "%s", lib->lib_Node.ln_Name);
- MySetContentsHealed (libmoretext3, "%s", nonetest (lib->lib_IdString));
- HandleWindowClose (ptr);
- }
- }
- }
- }
-
- void GetLibMore (struct Library *lib) {
- char *title = "LIBRARY: ";
-
- GetLDRMore (lib, title, LibrariesText);
- }
-
- void GetDevMore (struct Library *lib) {
- char *title = "DEVICE: ";
-
- GetLDRMore (lib, title, DevicesText);
- }
-
- void GetResMore (struct Library *lib) {
- char *title = "RESOURCE: ";
-
- GetLDRMore (lib, title, ResourcesText);
- }
-
- void PrintLDR (APTR list, char type, char *filename) {
- int i;
- BPTR handle;
- struct LibEntry *entryp;
-
- handle = HandlePrintStart (filename);
- if ((handle) && (PrintOneLine (handle, "\n Address Pri OpenC RPC Name & Version\n\n"))) {
- if ((type == 'L') && (! WI_Libraries)) {
- i = FillLDRList ('L', &entryp);
- } else if ((type == 'D') && (! WI_Devices)) {
- i = FillLDRList ('D', &entryp);
- } else if ((type == 'R') && (! WI_Resources)) {
- i = FillLDRList ('R', &entryp);
- }
- // if (i) {
- for (i=0;;i++) {
-
- if (((type == 'L') && (WI_Libraries)) \
- || ((type == 'D') && (WI_Devices)) \
- || ((type == 'R') && (WI_Resources))) {
- DoMethod (list,MUIM_List_GetEntry,i,&entryp);
- }
- if (!entryp) break;
-
- sprintf (tmpstr2, " %ls %4ls %4ls %3ls %ls %ld.%ld\n", entryp->lib_address, entryp->lib_pri, entryp->lib_ocnt, entryp->lib_rcnt, entryp->lib_name, ((struct Library *) entryp->lib_ptr)->lib_Version, ((struct Library *) entryp->lib_ptr)->lib_Revision);
- if (! (PrintOneLine (handle, tmpstr2)))
- break;
-
- if (((type == 'L') && (! WI_Libraries)) \
- || ((type == 'D') && (! WI_Devices)) \
- || ((type == 'R') && (! WI_Resources))) {
- entryp = entryp->lib_next;
- }
- }
- // }
- }
- HandlePrintStop();
- }
-
- void PrintLibraries (char *filename) {
- PrintLDR (liblist,'L',filename);
- }
-
- void PrintDevices (char *filename) {
- PrintLDR (devlist,'D',filename);
- }
-
- void PrintResources (char *filename) {
- PrintLDR (reslist,'R',filename);
- }
-
- int FillLDRList (char kind, struct LibEntry **first) {
- struct Library *lib;
- APTR list;
- struct Remember **key;
- char *cmd;
-
- struct LibEntry *libentry,*previous = NULL;
- int tmp,teststatus;
-
- int libcnt = 0;
- *first = 0;
-
- if (kind == 'L') {
- FreeLibraries ();
- key = &LibRememberKey;
- lib = FIRSTLIBRARY;
- list = liblist;
- cmd = "GetLibList";
- } else if (kind == 'D') {
- FreeDevices ();
- key = &DevRememberKey;
- lib = FIRSTDEVICE;
- list = devlist;
- cmd = "GetDevList";
- } else if (kind == 'R') {
- FreeResources ();
- key = &ResRememberKey;
- lib = FIRSTRESOURCE;
- list = reslist;
- cmd = "GetResList";
- }
-
- if (clientstate) {
- if (SendDaemon (cmd)) {
- while ((libentry = AllocRemember (key, sizeof (struct LibEntry), MEMF_ANY|MEMF_CLEAR)) \
- && (ReceiveDecodedEntry ((UBYTE *) libentry, sizeof (struct LibEntry)))) {
- IsHex (libentry->lib_address, (long *) &libentry->lib_ptr);
-
- if (! *first)
- *first = libentry;
- if (previous)
- previous->lib_next = libentry;
-
- libcnt++;
- previous = libentry;
- }
- }
- } else {
- while ((lib->lib_Node.ln_Succ != 0) && (libentry = AllocRemember (key, sizeof (struct LibEntry), MEMF_ANY|MEMF_CLEAR))) {
- if (! *first)
- *first = libentry;
- if (previous)
- previous->lib_next = libentry;
-
- libentry->lib_ptr = (char *) lib;
- sprintf (libentry->lib_address, "$%08x",lib);
- strncpy (libentry->lib_name, lib->lib_Node.ln_Name, 30);
- sprintf (libentry->lib_pri, "%4d ", lib->lib_Node.ln_Pri);
-
- teststatus = TestResource (lib);
-
- if (teststatus) {
- sprintf (libentry->lib_ocnt, "%3d ", lib->lib_OpenCnt);
- if ((tmp = GetRamPointerCount(lib)) == (lib->lib_NegSize / 6)) {
- strcpy (libentry->lib_rcnt, "***");
- } else {
- sprintf (libentry->lib_rcnt, "%3d", tmp);
- }
- } else {
- strcpy (libentry->lib_ocnt, "--- ");
- strcpy (libentry->lib_rcnt, "---");
- }
- strcpy (libentry->lib_type, GetNodeType (lib->lib_Node.ln_Type));
-
- libcnt++;
- previous = libentry;
- lib = (struct Library *)lib->lib_Node.ln_Succ;
- }
- }
- return (libcnt);
- }
-
- void FreeLibraries (void) {
- MyFreeStructs (&LibRememberKey, libtext, liblist);
- }
-
- void FlushLibraries (void) {
- struct Library *lib,*next;
-
- lib = FIRSTLIBRARY;
-
- while (next = (struct Library *) lib->lib_Node.ln_Succ) {
- if (! lib->lib_OpenCnt)
- RemLibrary (lib);
- lib = next;
- }
- }
-
- void FreeDevices (void) {
- MyFreeStructs (&DevRememberKey, devtext, devlist);
- }
-
- void FlushDevices (void) {
- struct Library *lib,*next;
-
- lib = FIRSTDEVICE;
-
- while (next = (struct Library *) lib->lib_Node.ln_Succ) {
- if (! lib->lib_OpenCnt)
- RemDevice ((struct Device *) lib);
- lib = next;
- }
-
- }
-
- void FreeResources (void) {
- MyFreeStructs (&ResRememberKey, restext, reslist);
- }
-
- void ShowLibraries (void) {
- struct LibEntry *lib;
-
- ApplicationSleep();
- set(liblist,MUIA_List_Quiet,TRUE);
- set(liblist,MUIA_List_CompareHook,liblist_cmphook_ptr);
- set(BT_LibRemove, MUIA_Disabled, TRUE);
- set(BT_LibClose, MUIA_Disabled, TRUE);
- set(BT_LibPriority, MUIA_Disabled, TRUE);
- set(BT_LibFunctions, MUIA_Disabled, TRUE);
- set(BT_LibMore, MUIA_Disabled, TRUE);
-
- libcnt = FillLDRList ('L', &lib);
-
- while (lib) {
- InsertSortedEntry (liblist, (APTR *) &lib);
- lib = lib->lib_next;
- }
-
- SetCountText (libcount, libcnt);
- AwakeApplication();
- set(liblist,MUIA_List_Quiet,FALSE);
- }
-
- void ShowDevices (void) {
- struct LibEntry *lib;
-
- ApplicationSleep();
- set(devlist,MUIA_List_Quiet,TRUE);
- set(devlist,MUIA_List_CompareHook,devlist_cmphook_ptr);
- set(BT_DevRemove, MUIA_Disabled, TRUE);
- set(BT_DevPriority, MUIA_Disabled, TRUE);
- set(BT_DevFunctions, MUIA_Disabled, TRUE);
- set(BT_DevMore, MUIA_Disabled, TRUE);
-
- devcnt = FillLDRList ('D', &lib);
-
- while (lib) {
- InsertSortedEntry (devlist, (APTR *) &lib);
- lib = lib->lib_next;
- }
-
- SetCountText (devcount, devcnt);
- AwakeApplication();
- set(devlist,MUIA_List_Quiet,FALSE);
- }
-
- void ShowResources (void) {
- struct LibEntry *lib;
-
- ApplicationSleep();
- set(reslist,MUIA_List_Quiet,TRUE);
- set(reslist,MUIA_List_CompareHook,reslist_cmphook_ptr);
- set(BT_ResRemove, MUIA_Disabled, TRUE);
- set(BT_ResPriority, MUIA_Disabled, TRUE);
- set(BT_ResFunctions, MUIA_Disabled, TRUE);
- set(BT_ResMore, MUIA_Disabled, TRUE);
-
- rescnt = FillLDRList ('R', &lib);
-
- while (lib) {
- InsertSortedEntry (reslist, (APTR *) &lib);
- lib = lib->lib_next;
- }
-
- SetCountText (rescount, rescnt);
- AwakeApplication();
- set(reslist,MUIA_List_Quiet,FALSE);
- }
-
- void SendLibList (void) {
- struct LibEntry *lib;
-
- FillLDRList ('L', &lib);
-
- while (lib) {
- SendEncodedEntry ((UBYTE *) lib, sizeof (struct LibEntry));
- lib = lib->lib_next;
- }
- FreeLibraries ();
- }
-
- void SendDevList (void) {
- struct LibEntry *lib;
-
- FillLDRList ('D', &lib);
-
- while (lib) {
- SendEncodedEntry ((UBYTE *) lib, sizeof (struct LibEntry));
- lib = lib->lib_next;
- }
- FreeDevices ();
- }
-
- void SendResList (void) {
- struct LibEntry *lib;
-
- FillLDRList ('R', &lib);
-
- while (lib) {
- SendEncodedEntry ((UBYTE *) lib, sizeof (struct LibEntry));
- lib = lib->lib_next;
- }
- FreeResources ();
- }
-
-